package cn.good.yan.service.t4;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 4. 中断机制
 * 一个线程中断，是由自己决定，不是由其他线程停止
 * 实现方式3： 通过 isInterrupted 判断， interrupt 协商
 * 实现方式2： 通过 AtomicBoolean原子类
 * 实现方式1： 通过 volatile 字段
 *
 * @author shengren.yan
 * @create 2024-03-27
 */
public class InterruptDemo1 {

    static volatile boolean isStop = false;  // volatile
    static AtomicBoolean atomicBoolean = new AtomicBoolean(false);  // 原子类

    public static void main(String[] args) {
        // 线程t1  方式3实现
        Thread t1 = new Thread(() -> {
            while (true) {
                // Thread.currentThread().isInterrupted() 判断线程是否被中断，true：中断状态
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println(Thread.currentThread().getName() + "\t 【实现方式3】，程序停止");
                    break;
                }
                System.out.println("t1 -----正在运行！！！");
            }
        }, "t1");
        t1.start();

        System.out.println("-----t1的默认中断标志位：" + t1.isInterrupted());
        // 暂停毫秒
        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // t2向t1发出协商，将t1的中断标志位设为true希望t1停下来
        new Thread(() -> {
            // 发启一个协商，停止t1线程，
            t1.interrupt();
        }, "t2").start();
        //t1.interrupt();

    }

    // 线程t1  方式2实现
    private static void m2_atomicBoolean() {
        new Thread(() -> {
            while (true) {
                if (atomicBoolean.get()) {
                    System.out.println(Thread.currentThread().getName() + "\t 【实现方式2 - 通过atomicBoolean原子性（）】，程序停止");
                    break;
                }
                System.out.println("t1 -----正在运行！！！");
            }
        }, "t1").start();

        //暂停毫秒
        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            // 改字段，该字段是原子类
            atomicBoolean.set(true);
        }, "t2").start();
    }

    // 方式1：
    private static void m1_volatile() {
        new Thread(() -> {
            while (true) {
                if (isStop) {
                    System.out.println(Thread.currentThread().getName() + "\t【实现方式1 - 通过isStop（）】程序停止");
                    break;
                }
                System.out.println("t1 -----正在运行！！！");
            }
        }, "t1").start();

        //暂停毫秒
        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            // 改变字段状态
            isStop = true;
        }, "t2").start();
    }
}
